package br.usjt.component.login.beans;

import static br.com.usjt.component.commons.login.util.ValidationUtil.isNull;
import static br.com.usjt.component.commons.login.util.ValidationUtil.not;
import static br.usjt.component.login.assembler.RecursoAssembler.toEntityAttached;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.inject.Inject;

import br.usjt.component.login.assembler.PerfilAssembler;
import br.usjt.component.login.assembler.RecursoAssembler;
import br.usjt.component.login.dto.PerfilDTO;
import br.usjt.component.login.dto.RecursoDTO;
import br.usjt.component.login.facade.RecursoBeanRemote;
import br.usjt.component.login.facade.dao.PerfilDao;
import br.usjt.component.login.facade.dao.RecursoDao;
import br.usjt.component.login.model.Perfil;
import br.usjt.component.login.model.Recurso;

@Stateless
@LocalBean
@Remote(RecursoBeanRemote.class)
public class RecursoBean extends AbstractBean implements RecursoBeanRemote {

    private static final long serialVersionUID = 6960264125623624020L;

    @Inject
    private RecursoDao dao;
    @Inject
    private PerfilDao perfilDao;

    public RecursoBean() {
    }

    @Override
    public void salvar(RecursoDTO dto) {
        validarDTO(dto);

        Recurso recurso = new RecursoAssembler(dto).getEntity();

        PerfilDTO perfilDto = dto.getPerfilDTO();
        if (not(isNull(perfilDto))) {
            Perfil perfil = perfilDao.findById(perfilDto.getId());
            recurso.setPerfil(null);
            dao.save(recurso);
            recurso.setPerfil(perfil);
            dao.update(recurso);
        } else {
            dao.save(recurso);
        }
    }

    @Override
    public List<RecursoDTO> consultarRecursosPor(PerfilDTO perfilDTO) {
        validarDTO(perfilDTO);

        Perfil perfil = new PerfilAssembler(perfilDTO).getEntity();

        List<Recurso> list = dao.findBy(perfil);
        List<RecursoDTO> listDto = new ArrayList<RecursoDTO>();
        for (Recurso recurso : list) {
            RecursoDTO dto = new RecursoAssembler(recurso).getDto();
            dto.setPerfilDTO(perfilDTO);
            listDto.add(dto);
        }

        return listDto;
    }

    @Override
    public void atualizar(RecursoDTO dto) {
        validarDTO(dto);

        Recurso recurso = new RecursoAssembler(dto).getEntity();
        Recurso recursoAttached = dao.findById(recurso.getId());

        toEntityAttached(recurso, recursoAttached);

        Perfil perfil = recurso.getPerfil();
        if (not(isNull(perfil))) {
            perfil = perfilDao.findById(perfil.getId());
            recursoAttached.setPerfil(perfil);
        }
        dao.update(recursoAttached);
    }

    @Override
    public void excluir(RecursoDTO dto) {
        validarDTO(dto);

        if (dto.isAtivo()) {
            dto.setAtivo(false);
        }

        atualizar(dto);
    }

}
